home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / wc90b.c < prev    next >
C/C++ Source or Header  |  2000-05-04  |  9KB  |  321 lines

  1. #include "driver.h"
  2. #include "vidhrdw/generic.h"
  3.  
  4. unsigned char *wc90b_shared;
  5.  
  6. unsigned char *wc90b_tile_colorram, *wc90b_tile_videoram;
  7. unsigned char *wc90b_tile_colorram2, *wc90b_tile_videoram2;
  8. unsigned char *wc90b_scroll1xlo, *wc90b_scroll1xhi;
  9. unsigned char *wc90b_scroll2xlo, *wc90b_scroll2xhi;
  10. unsigned char *wc90b_scroll1ylo, *wc90b_scroll1yhi;
  11. unsigned char *wc90b_scroll2ylo, *wc90b_scroll2yhi;
  12.  
  13. size_t wc90b_tile_videoram_size;
  14. size_t wc90b_tile_videoram_size2;
  15.  
  16. static unsigned char *dirtybuffer1 = 0, *dirtybuffer2 = 0;
  17. static struct osd_bitmap *tmpbitmap1 = 0,*tmpbitmap2 = 0;
  18.  
  19. int wc90b_vh_start( void ) {
  20.  
  21.     if ( generic_vh_start() )
  22.         return 1;
  23.  
  24.     if ( ( dirtybuffer1 = malloc( wc90b_tile_videoram_size ) ) == 0 ) {
  25.         return 1;
  26.     }
  27.  
  28.     memset( dirtybuffer1, 1, wc90b_tile_videoram_size );
  29.  
  30.     if ( ( tmpbitmap1 = osd_new_bitmap(4*Machine->drv->screen_width,2*Machine->drv->screen_height,Machine->scrbitmap->depth ) ) == 0 ){
  31.         free( dirtybuffer1 );
  32.         generic_vh_stop();
  33.         return 1;
  34.     }
  35.  
  36.     if ( ( dirtybuffer2 = malloc( wc90b_tile_videoram_size2 ) ) == 0 ) {
  37.         osd_free_bitmap(tmpbitmap1);
  38.         free(dirtybuffer1);
  39.         generic_vh_stop();
  40.         return 1;
  41.     }
  42.  
  43.     memset( dirtybuffer2, 1, wc90b_tile_videoram_size2 );
  44.  
  45.     if ( ( tmpbitmap2 = osd_new_bitmap( 4*Machine->drv->screen_width,2*Machine->drv->screen_height,Machine->scrbitmap->depth ) ) == 0 ){
  46.         osd_free_bitmap(tmpbitmap1);
  47.         free(dirtybuffer1);
  48.         free(dirtybuffer2);
  49.         generic_vh_stop();
  50.         return 1;
  51.     }
  52.  
  53.     // Free the generic bitmap and allocate one twice as wide
  54.     free( tmpbitmap );
  55.  
  56.     if ( ( tmpbitmap = osd_new_bitmap( 2*Machine->drv->screen_width,Machine->drv->screen_height,Machine->scrbitmap->depth ) ) == 0 ){
  57.         osd_free_bitmap(tmpbitmap1);
  58.         osd_free_bitmap(tmpbitmap2);
  59.         free(dirtybuffer);
  60.         free(dirtybuffer1);
  61.         free(dirtybuffer2);
  62.         generic_vh_stop();
  63.         return 1;
  64.     }
  65.  
  66.     return 0;
  67. }
  68.  
  69. void wc90b_vh_stop ( void ) {
  70.     free( dirtybuffer1 );
  71.     free( dirtybuffer2 );
  72.     osd_free_bitmap( tmpbitmap1 );
  73.     osd_free_bitmap( tmpbitmap2 );
  74.     generic_vh_stop();
  75. }
  76.  
  77. READ_HANDLER( wc90b_tile_videoram_r ) {
  78.     return wc90b_tile_videoram[offset];
  79. }
  80.  
  81. WRITE_HANDLER( wc90b_tile_videoram_w ) {
  82.     if ( wc90b_tile_videoram[offset] != data ) {
  83.         dirtybuffer1[offset] = 1;
  84.         wc90b_tile_videoram[offset] = data;
  85.     }
  86. }
  87.  
  88. READ_HANDLER( wc90b_tile_colorram_r ) {
  89.     return wc90b_tile_colorram[offset];
  90. }
  91.  
  92. WRITE_HANDLER( wc90b_tile_colorram_w ) {
  93.     if ( wc90b_tile_colorram[offset] != data ) {
  94.         dirtybuffer1[offset] = 1;
  95.         wc90b_tile_colorram[offset] = data;
  96.     }
  97. }
  98.  
  99. READ_HANDLER( wc90b_tile_videoram2_r ) {
  100.     return wc90b_tile_videoram2[offset];
  101. }
  102.  
  103. WRITE_HANDLER( wc90b_tile_videoram2_w ) {
  104.     if ( wc90b_tile_videoram2[offset] != data ) {
  105.         dirtybuffer2[offset] = 1;
  106.         wc90b_tile_videoram2[offset] = data;
  107.     }
  108. }
  109.  
  110. READ_HANDLER( wc90b_tile_colorram2_r ) {
  111.     return wc90b_tile_colorram2[offset];
  112. }
  113.  
  114. WRITE_HANDLER( wc90b_tile_colorram2_w ) {
  115.     if ( wc90b_tile_colorram2[offset] != data ) {
  116.         dirtybuffer2[offset] = 1;
  117.         wc90b_tile_colorram2[offset] = data;
  118.     }
  119. }
  120.  
  121. READ_HANDLER( wc90b_shared_r ) {
  122.     return wc90b_shared[offset];
  123. }
  124.  
  125. WRITE_HANDLER( wc90b_shared_w ) {
  126.     wc90b_shared[offset] = data;
  127. }
  128.  
  129. static void wc90b_draw_sprites( struct osd_bitmap *bitmap, int priority ){
  130.   int offs;
  131.  
  132.   /* draw all visible sprites of specified priority */
  133.     for ( offs = spriteram_size - 8;offs >= 0;offs -= 8 ){
  134.  
  135.         if ( ( ~( spriteram[offs+3] >> 6 ) & 3 ) == priority ) {
  136.  
  137.             if ( spriteram[offs+1] > 16 ) { /* visible */
  138.                 int code = ( spriteram[offs+3] & 0x3f ) << 4;
  139.                 int bank = spriteram[offs+0];
  140.                 int flags = spriteram[offs+4];
  141.  
  142.                 code += ( bank & 0xf0 ) >> 4;
  143.                 code <<= 2;
  144.                 code += ( bank & 0x0f ) >> 2;
  145.  
  146.                 drawgfx( bitmap,Machine->gfx[ 17 ], code,
  147.                         flags >> 4, /* color */
  148.                         bank&1, /* flipx */
  149.                         bank&2, /* flipy */
  150.                         spriteram[offs + 2], /* sx */
  151.                         240 - spriteram[offs + 1], /* sy */
  152.                         &Machine->drv->visible_area,TRANSPARENCY_PEN,15 );
  153.             }
  154.         }
  155.     }
  156. }
  157.  
  158. void wc90b_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  159. {
  160.     int offs, i;
  161.     int scrollx, scrolly;
  162.  
  163.  
  164.  
  165.     /* compute palette usage */
  166.     {
  167.         unsigned short palette_map[4 * 16];
  168.         int tile, gfx, cram;
  169.  
  170.         memset (palette_map, 0, sizeof (palette_map));
  171.  
  172.         for ( offs = wc90b_tile_videoram_size2 - 1; offs >= 0; offs-- ) {
  173.             tile = wc90b_tile_videoram2[offs];
  174.             cram = wc90b_tile_colorram2[offs];
  175.             gfx = 9 + ( cram & 3 ) + ( ( cram >> 1 ) & 4 );
  176.             palette_map[3*16 + (cram >> 4)] |= Machine->gfx[gfx]->pen_usage[tile];
  177.         }
  178.         for ( offs = wc90b_tile_videoram_size - 1; offs >= 0; offs-- ) {
  179.             tile = wc90b_tile_videoram[offs];
  180.             cram = wc90b_tile_colorram[offs];
  181.             gfx = 1 + ( cram & 3 ) + ( ( cram >> 1 ) & 4 );
  182.             palette_map[2*16 + (cram >> 4)] |= Machine->gfx[gfx]->pen_usage[tile];
  183.         }
  184.         for ( offs = videoram_size - 1; offs >= 0; offs-- ) {
  185.             cram = colorram[offs];
  186.             tile = videoram[offs] + ( ( cram & 0x07 ) << 8 );
  187.             palette_map[1*16 + (cram >> 4)] |= Machine->gfx[0]->pen_usage[tile];
  188.         }
  189.         for ( offs = spriteram_size - 8;offs >= 0;offs -= 8 ){
  190.             if ( spriteram[offs+1] > 16 ) { /* visible */
  191.                 int flags = spriteram[offs+4];
  192.                 palette_map[0*16 + (flags >> 4)] |= 0xfffe;
  193.             }
  194.         }
  195.  
  196.         /* expand the results */
  197.         for (i = 0; i < 1*16; i++)
  198.         {
  199.             int usage = palette_map[i], j;
  200.             if (usage)
  201.             {
  202.                 palette_used_colors[i * 16 + 0] = PALETTE_COLOR_TRANSPARENT;
  203.                 for (j = 1; j < 16; j++)
  204.                     if (usage & (1 << j))
  205.                         palette_used_colors[i * 16 + j] = PALETTE_COLOR_USED;
  206.                     else
  207.                         palette_used_colors[i * 16 + j] = PALETTE_COLOR_UNUSED;
  208.             }
  209.             else
  210.                 memset (&palette_used_colors[i * 16 + 0], PALETTE_COLOR_UNUSED, 16);
  211.         }
  212.         for (i = 1*16; i < 4*16; i++)
  213.         {
  214.             int usage = palette_map[i], j;
  215.             if (usage)
  216.             {
  217.                 for (j = 0; j < 15; j++)
  218.                     if (usage & (1 << j))
  219.                         palette_used_colors[i * 16 + j] = PALETTE_COLOR_USED;
  220.                     else
  221.                         palette_used_colors[i * 16 + j] = PALETTE_COLOR_UNUSED;
  222.                 palette_used_colors[i * 16 + 15] = PALETTE_COLOR_TRANSPARENT;
  223.             }
  224.             else
  225.                 memset (&palette_used_colors[i * 16 + 0], PALETTE_COLOR_UNUSED, 16);
  226.         }
  227.  
  228.         if (palette_recalc ())
  229.         {
  230.             memset( dirtybuffer,  1, videoram_size );
  231.             memset( dirtybuffer1, 1, wc90b_tile_videoram_size );
  232.             memset( dirtybuffer2, 1, wc90b_tile_videoram_size2 );
  233.         }
  234.     }
  235.  
  236. /* commented out -- if we copyscrollbitmap below with TRANSPARENCY_NONE, we shouldn't waste our
  237.    time here:
  238.     wc90b_draw_sprites( bitmap, 3 );
  239. */
  240.  
  241.     for ( offs = wc90b_tile_videoram_size2 - 1; offs >= 0; offs-- ) {
  242.         int sx, sy, tile, gfx;
  243.  
  244.         if ( dirtybuffer2[offs] ) {
  245.  
  246.             dirtybuffer2[offs] = 0;
  247.  
  248.             sx = ( offs % 64 );
  249.             sy = ( offs / 64 );
  250.  
  251.             tile = wc90b_tile_videoram2[offs];
  252.             gfx = 9 + ( wc90b_tile_colorram2[offs] & 3 ) + ( ( wc90b_tile_colorram2[offs] >> 1 ) & 4 );
  253.  
  254.             drawgfx(tmpbitmap2,Machine->gfx[ gfx ],
  255.                     tile,
  256.                     wc90b_tile_colorram2[offs] >> 4,
  257.                     0,0,
  258.                     sx*16,sy*16,
  259.                     0,TRANSPARENCY_NONE,0);
  260.         }
  261.     }
  262.  
  263.     scrollx = -wc90b_scroll2xlo[0] - 256 * ( wc90b_scroll2xhi[0] & 3 );
  264.     scrolly = -wc90b_scroll2ylo[0] - 256 * ( wc90b_scroll2yhi[0] & 1 );
  265.  
  266.     copyscrollbitmap(bitmap,tmpbitmap2,1,&scrollx,1,&scrolly,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  267.  
  268.     wc90b_draw_sprites( bitmap, 2 );
  269.  
  270.     for ( offs = wc90b_tile_videoram_size - 1; offs >= 0; offs-- ) {
  271.         int sx, sy, tile, gfx;
  272.  
  273.         if ( dirtybuffer1[offs] ) {
  274.  
  275.             dirtybuffer1[offs] = 0;
  276.  
  277.             sx = ( offs % 64 );
  278.             sy = ( offs / 64 );
  279.  
  280.             tile = wc90b_tile_videoram[offs];
  281.             gfx = 1 + ( wc90b_tile_colorram[offs] & 3 ) + ( ( wc90b_tile_colorram[offs] >> 1 ) & 4 );
  282.  
  283.             drawgfx(tmpbitmap1,Machine->gfx[ gfx ],
  284.                     tile,
  285.                     wc90b_tile_colorram[offs] >> 4,
  286.                     0,0,
  287.                     sx*16,sy*16,
  288.                     0,TRANSPARENCY_NONE,0);
  289.         }
  290.     }
  291.  
  292.     scrollx = -wc90b_scroll1xlo[0] - 256 * ( wc90b_scroll1xhi[0] & 3 );
  293.     scrolly = -wc90b_scroll1ylo[0] - 256 * ( wc90b_scroll1yhi[0] & 1 );
  294.  
  295.     copyscrollbitmap(bitmap,tmpbitmap1,1,&scrollx,1,&scrolly,&Machine->drv->visible_area,TRANSPARENCY_PEN,palette_transparent_pen);
  296.  
  297.     wc90b_draw_sprites( bitmap, 1 );
  298.  
  299.     for ( offs = videoram_size - 1; offs >= 0; offs-- ) {
  300.         if ( dirtybuffer[offs] ) {
  301.             int sx, sy;
  302.  
  303.             dirtybuffer[offs] = 0;
  304.  
  305.             sx = (offs % 64);
  306.             sy = (offs / 64);
  307.  
  308.             drawgfx(tmpbitmap,Machine->gfx[0],
  309.                     videoram[offs] + ( ( colorram[offs] & 0x07 ) << 8 ),
  310.                     colorram[offs] >> 4,
  311.                     0,0,
  312.                     sx*8,sy*8,
  313.                     0,TRANSPARENCY_NONE,0);
  314.         }
  315.     }
  316.  
  317.     copybitmap( bitmap, tmpbitmap, 0, 0, 0, 0,&Machine->drv->visible_area, TRANSPARENCY_PEN,palette_transparent_pen );
  318.  
  319.     wc90b_draw_sprites( bitmap, 0 );
  320. }
  321.